If this is a first time you visiting Scrolls, please register in Fight Club. If you already registered, please authorize on Fight Club start page with your login and password.
Felix War [8] (07.01.07 09:40) По многочисленным Жалобам на форуме Бойцовского Клуба стало известно, что каким то образом пытаясь зайти своим персонажем, вы случайно можете зайти абсолютно другим.
Странным мне все это показалось, тем более, что после большого количества флуда и примеров таких заходов Администрация расписалась в полном бессилии в решении этого важного вопроса.
Повелитель Огня [21] (07.01.07 23:32) Слухи бродят, фактов, к сожалению, нет. Если у кого-либо есть настоящая информация обо всем этом, или рабочая гипотеза, то пожалуйста, напишите. Остальных же, я прошу не флудить и не разводить панику на пустом месте.
Ну думаю, настал мой звездный час, надо действовать, тем более рабочее время позволяло потратить пару--тройку часиков на попытку найти решение этой проблемы. Слава богу под рукой есть работающие клановые боты, вот на них и будем ставить опыты.
Сразу скажу, что потратил я на свои изыскания не пару-тройку часов, а три дня. А дело было так.
Первый скрипт, который нас встречает, это enter.pl. При вводе логина и пароля на www.combats.ru на странице случайным образом выбирается город, который нас будет авторизавать. Будем считать, что мы входим персонажем Ritter Capital[1], который проживает в CapitalCity. Тогда алгоритм входа будет примерно таким:
www.combats.ru 1. На странице генерируется формочка document.write('<form action="http://'+serv[ Math.floor(Math.random() * serv.length) ] +'.combats.ru/enter.pl" method=post name="F1">') для ввода логина и пароля. 2. Мы вводим логин и пароль и нажимаем "Войти" 3. Нас перекидывает на случайный сервер БК, выбранный на шаге 1. Будем считать, что это SunCity. Следовательно вызывается скрипт http://suncity.combats.ru/enter.pl?login=Ritter+Capital&psw=пароль [POST, но можно и GET]
suncity.combats.ru/enter.pl?login=...&psw=... 4. Этот скрипт генерит автоформу, т.е. загружаемая страница сразу сама себя подтверждает, перекидывая нас сразу в родной город, в нашем случае это CapitalCity. Вызывается скрипт http://capitalcity.combats.ru/enter.pl?from=city4.combats.ru&sid=1141152521.4556 [POST]
http://capitalcity.combats.ru/enter.pl?from=...&sid=... 5. Этот скрипт запрашивает наш второй пароль 6. После проверки пароля грузится главная страница http://capitalcity.combats.ru/buttons.pl?battle=0.051203661114549. Здесь же устанавливаются кукисы персонажа.
Вот собственно и весь алгоритм. И где же здесь искать багу с заходом под другим персонажем? Скрипт www.combats.ru вроде не вызывает никаких отрицательных эмоций, он просто передает введенные логин и пароль далее по цепочке. А вот следующий скрипт (suncity.combats.ru/enter.pl?login=...&psw=...) меня очень заинтересовал, приведу его полностью:
Это получается, что наши логин и пароль уже дальше не передаются, а мы теперь идентифицируемся двумя другими параметрами from и sid. Как несложно догадаться city4 и есть SunCity. Можно предположить, что сервер SunCity проверил наш логин и пароль и присвоил нам в некоторой базе данных значение 11695697280.8804324649169320.287923577223545. Поскольку дальше идет переадресация на сервер СapitalСity, то можно предположить, что сервер СapitalСity должен потом обратится к серверу SunCity, для того, чтобы получить данные о нашем персонаже и выполнить все необходимые действия по инициализации пользователя.
Итак, можно утверждать, что наш персонаж в момент входа в БК идентифицируется на сервере SunCity строкой 11695697280.8804324649169320.287923577223545 Что же представляет из себя эта строка? Немного позаходив ботом догадался, что эта строка состоит из трех блоков, разделенных точками. Первый блок – это текущая метка времени в формате Unix, вторая и третья – это случайные числа.
Вот оно потенциальное место для ошибки! Предположим, что два персонажа в одно и тоже время (с точностью до секунды) входят в БК. Главная страница БК обоих отправляет на один и тот же сервер для авторизации и им обоим присваиваются одинаковые значения sid. В этом случае, один из пользователей имеет потенциальную возможность зайти другим.
Теперь следует проверить наши предположения, а именно надо ответить на вопрос, какова вероятность совпадения sid. Шестнадцатизначных чисел в Perl нет. Значит каждый блок состоит из сцепки нескольких рандомов. Пишем простой код
$rand_cache=array(); for($i=0;$i<100000;$i++){ $value=rand(10000000,99999999).rand(10000000,99999999).".".rand(10000000,99999999).rand(10000000,99999999); if(isset($rand_cache[$value])) { echo "Повтор числа $value на $i-й итерации\n"; break; } $rand_cache[$value]=1; }
Запускаем и получаем: Повтор числа 5948516847633666.6503875737037353 на 8192-й итерации
Офигеть! А что если использовать не четыре рандома с восьмизначными числами, а восемь с четырехзначными? Не вопрос, переписываем код и получаем: Повтор числа 8285353615544788.7792883054466628 на 4096-й итерации
Продолжение с экспериментами показало, что чем больше рандомов в сцепке тем выше вероятность выпадения повторяющегося числа. Повтор этого кода на Perl показал сходные результаты.
У этого есть свои объяснения. В большинстве библиотек используются программные датчики случайных чисел, поэтому их по-честному называют псевдослучайными. Для желающих по больше разобраться в этом вопросе отсылаю к книге Кнута, 2том, стр.28. Главное, что эти последовательности повторяются. А теперь представим сколько раз вызывается функция rand() на сервере БК, с учетом того, что практически все процессы игрового мира построены на случайных величинах! Вот и получаем, что вероятность повтора параметра sid достаточно велика. А прицепливание нескольких функций rand() паровозиком только увелимчивает скорость выборки последовательности.
Можно сказать, что первый мой опыт поиска дырок в чужом коде оказался успешным. Естественно я поспешил поделится своими достижениями с Администрацией БК. Было накатано и отправлено письмо по адресу admin@combats.ru. Ну естественно рекомендации от самого лучшего хакера: Если мои измышления верны, то можно порекомендовать представить код sid в виде <person_id>.<sec>.<msec>.<random>
Честно признаюсь, ночью мне снились арты, много артов, ...
На утро никакого ответа не было, как и на следующий день, и еще через день. Повтор письма не исправил ситуации. И тут вижу новость на Stalkers. Отписался в комментах, что баг-то я уже нашел, да вот реакции ноль. Уже через пару минут я общался в аське с Матвиком (теперь он шифруется под ником sh[10]). После всех объяснений и выкладок произошел примерно следующий диалог:
Матвик похоже это оно. Alex Nomad Посмотрим что админы скажут. Надеюсь они почту читают Матвик даже если не читают, твои слова я передам) цитатой ессно Матвик потому как это очень похоже на правду ) Alex Nomad ок, спасибо Матвик да в общем-то тебе спасибо... надеюсь не обделят тебя ) Alex Nomad :-)
И опять во сне я видел кучу артов, а также бои где я побеждаю одной левой… Но прошел один день, потом другой, а новостей все не было. Не получал их ни я, ни Матвик. И вот однажды:
Alex Nomad Привет что-то слышно от админов? Или все еще спят? ))) Матвик привет. проверили. не сошлось в общем они проверили, из 1000000 попыток генерации ида ни одного не совпало на этом забили проверять но добавили в этот код еще номер персонажа, чтобы исключить шанс совпадения
Лезу в код скрипта, и действительно в начало кода sid добавлен id персонажа - в принципе это решает проблему полностью.
Захожу в БК, ни артов тебе, ни 100кр за баг (а у меня было уже решение!), ничего… Эх, тяжела жизнь программера…
P.S. В настоящий момент код sid генерится немного по другому. Сравните его с моими рекомендациями. Не уверен, что админы ими воспользовались, но приятно что наши головы работают в одном направлении.
> Предположим, что два персонажа в одно и тоже время (с точностью > до секунды) входят в БК. Главная страница БК обоих отправляет > на один и тот же сервер для авторизации и им обоим присваиваются > одинаковые значения sid. В этом случае, один из пользователей > имеет потенциальную возможность зайти другим.
Я блондинка ) поэтому вставлю свое слово ;) года два назад испытала на себе этот баг ) И заходили мы не одновременно с тем персонажем, который в итоге висел в моем верхнем фрейме...Дело было в следующем: мы с моим бкшным знакомым решили из сана ехать в кэп, он сел на карету в 21 с чем-то, я взяла билет на 23 с чем-то...Они играл в БК только днем с работы, вечером его не было, он был в оффе, да и зачем, он ж сел на карету и поехал и оставил перса до утра в оффе... и вот стою на вокзале в ожидании своей кареты, в этот момент его карета прибывает в кэп, у меня обновляется верхний фрейм и я вижу себя в кэпе...открываю кнопку инвентаря - перс не мой, а моего знакомого... )) Вот так ))
Приветствую. Наш с тобой разговор был 29 января, а этот топик был закрыт 25-го. Так что это скорее воспоминания. А вот было бы интересно, встречаются ли такие ошибки сейчас.
с тех пор я ни разу не слышал о том, чтобы кто-то зашел чужим чаром а слушаю я многих ) так что видимо все же это оно было... жаль что тебя не наградили..
Гы=) Круто!!!!! Имея на руках ID персонажа не использовать его! Думаю, такие вещи надо патентовать. Использовать, к примеру, при работе с кредитными картами=)))) Живо представляю сообщения в газетах "Сегодня некто снял деньги по карте Абрамовича"=)))))))))